/******************************************************************************
 * Copyright (C) 2017 Chengdu Dlhd information industry co. LTD.
 * All Rights Reserved.
 * 本软件为成都顶联互动信息产业有限公司开发研制。未经本公司正式书面同意，其他任何个人、团体不得使用、复制、修改或发布本软件.
 *****************************************************************************/
package net.dgg.dggcloud.core.util;

import net.dgg.dggencryption.AESPlus;
import net.dgg.dggencryption.NJCode;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;

/**
 * @ClassName: NJCodeUtil
 * @Description:
 * @Author 汤宏
 * @date 2018-03-15 10:37
 */

public class NJCodeUtil {
    private String type = "";//开发环境 dev 线上环境 online
    private String key = "";//开发环境默认加密KEY

    /**
     * 解密密码
     *
     * @param str
     * @return
     */
    public String decrypt(String str) {
        try{
            if(null == str || str.equals("")){
                return str;
            }
            if ("dev".equals(type)) {
                return AESPlus.decrypt(str, key);
            }
            NJCode nc = NJCode.INSTANCE;
            return nc.ndecrypt(str);
        } catch (Exception e) {
            System.out.println("解密异常  " + str);
        }
        return str;
    }

    /**
     * 加密
     *
     * @param str
     * @return
     */
    public String encrypt(String str) {
        if(null == str || str.equals("")){
            return str;
        }
        if ("dev".equals(type)) {
            return AESPlus.encrypt(str, key);
        }
        NJCode nc = NJCode.INSTANCE;
        return nc.nencrypt(str);
    }

    /**
     * 集合数据中解密
     *
     * @param columns 需要解密的列的key 如：String[] column = {"phone","idcard"};
     * @param list    需要解密的数据集合 List<Object>
     */
    public List decryptList(String[] columns, List list) {
        if (null != columns && null != list) {
            for (int x = 0; x < list.size(); x++) {
                Object o = list.get(x);
                Field[] fs = o.getClass().getDeclaredFields();
                for (int i = 0; i < fs.length; i++) {
                    Field f = fs[i];
                    f.setAccessible(true); //设置些属性是可以访问的
                    try {
                        Object colVal = f.get(o);//得到此属性的值
                        for (String colKey : columns) {
                            if (colKey.equals(f.getName())) {//如果传入的列名跟属性名相同，则翻译
                                String keyType = f.getType().toString();//得到此属性的类型
                                if (keyType.endsWith("String")) {
                                    if (null != colVal && !"".equals(colVal)) {
                                        colVal = this.decrypt(colVal.toString());
                                        f.set(o, colVal); //给属性设值
                                    }
                                }
                            }
                        }
                    }catch (Exception e){

                    }
                }

            }
        }
        return list;
    }


    /**
     * 集合数据中解密
     *
     * @param columns 需要解密的列的key 如：String[] column = {"phone","idcard"};
     * @param list    需要解密的数据集合List<Map>
     */
    public List<Map> decryptListMap(String[] columns, List<Map> list) {
        if (null != columns && null != list) {
            for (int i = 0; i < list.size(); i++) {
                Map<String, Object> map = list.get(i);
                for (String colKey : map.keySet()) {
                    if (useLoop(columns, colKey)) {
                        if (null != map.get(colKey)) {
                            String colVal = null != map.get(colKey) ? map.get(colKey).toString() : "";
                            if (null != colVal && !"".equals(colVal)) {
                                colVal = this.decrypt(colVal);
                                map.put(colKey, colVal);
                            }
                        }
                    }
                }
            }
        }
        return list;
    }

    /**
     * 查询数组中有无某个值
     *
     * @param arr
     * @param targetValue
     * @return
     */
    public static boolean useLoop(String[] arr, String targetValue) {
        for (String s : arr) {
            if (s.equals(targetValue))
                return true;
        }
        return false;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

}
